package com.ruoyi.order.listen;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.rabbitmq.client.Channel;
import com.ruoyi.common.core.constant.MqConstants;
import com.ruoyi.edu.api.domain.EduCourse;
import com.ruoyi.order.api.domain.TOrder;
import com.ruoyi.order.api.domain.dto.TeacherNameDto;
import com.ruoyi.order.service.ITOrderService;
import com.ruoyi.user.api.domain.UcenterMember;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;

/**
 * 监听信息服务
 * 若课程、老师、会员信息更改，则修改对应订单信息
 *
 * @author Alex
 * @version 1.0
 * @date 2023/9/25 15:38
 */
@Service
public class EduListen {

    @Resource
    private ITOrderService itOrderService;

    /**
     * 接收课程更新信息
     *
     * @param message 信息
     */
    @RabbitListener(queues = {MqConstants.COURSE_QUEUE})
    public void receiveCourseMessage(Message message, Channel channel) throws IOException {
        // 获取更新的课程信息
        EduCourse eduCourse = JSON.parseObject(message.getBody(), EduCourse.class);
        // 根据修改的课程id，查询对应的订单并修改订单中的课程标题
        LambdaUpdateWrapper<TOrder> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(TOrder::getCourseId, eduCourse.getId());
        // 如果没有对应的订单存在，直接结束即可
        if (itOrderService.count(wrapper) == 0) {
            return;
        }
        wrapper.set(TOrder::getCourseTitle, eduCourse.getTitle());
        if (itOrderService.update(wrapper)) {
            // 业务成功则签收消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } else {
            // 业务失败拒签消息
            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
        }
    }

    /**
     * 接收老师更新信息
     *
     * @param message 信息
     */
    @RabbitListener(queues = {MqConstants.TEACHER_QUEUE})
    public void receiveTeacherMessage(Message message, Channel channel) throws IOException {
        // 获取更新的课程信息
        TeacherNameDto dto = JSON.parseObject(message.getBody(), TeacherNameDto.class);
        // 根据修改前的教师名称，查询对应的订单并修改订单中的教师名称
        LambdaUpdateWrapper<TOrder> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(TOrder::getTeacherName, dto.getOldName());
        // 如果没有对应的订单存在，直接结束即可
        if (itOrderService.count(wrapper) == 0) {
            return;
        }
        wrapper.set(TOrder::getTeacherName, dto.getNewName());
        if (itOrderService.update(wrapper)) {
            // 业务成功则签收消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } else {
            // 业务失败拒签消息
            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
        }
    }

    /**
     * 订阅会员更新信息
     *
     * @param message 信息
     */
    @RabbitListener(queues = {MqConstants.MEMBER_QUEUE})
    public void receiveMemberMessage(Message message, Channel channel) throws IOException {
        // 获取更新的会员信息
        UcenterMember member = JSON.parseObject(message.getBody(), UcenterMember.class);
        // 根据修改前的会员id，查询对应的订单并修改订单中的会员信息
        LambdaUpdateWrapper<TOrder> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(TOrder::getMemberId, member.getId());
        // 如果没有对应的订单存在，直接结束即可
        if (itOrderService.count(wrapper) == 0) {
            return;
        }
        wrapper.set(TOrder::getNickname, member.getNickname());
        itOrderService.update(wrapper);
    }
}
